package cn.tedu.store.service.impl;

import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.tedu.store.entity.Cart;
import cn.tedu.store.entity.Product;
import cn.tedu.store.mapper.CartMapper;
import cn.tedu.store.service.ICartService;
import cn.tedu.store.service.IProductService;
import cn.tedu.store.service.ex.AccessDeniedException;
import cn.tedu.store.service.ex.CartNotFoundException;
import cn.tedu.store.service.ex.InsertException;
import cn.tedu.store.service.ex.UpdateException;
import cn.tedu.store.vo.CartVo;
/**
 * 购物车业务层实现类
 * @author DELL
 *
 */
@Service
public class CartServiceImpl implements ICartService {

	@Autowired
	private CartMapper cartMap;
	@Autowired
	private IProductService service;
	
	@Override
	@Transactional
	public void addToCart(Integer uid, Integer num, Integer pid, String username) {
		//通过uid和pid参数 获取数据；
		Cart result = findByUidAndPid(uid, pid);
		//判断返回的数据是否为空  是则抛异常
		Date now = new Date();
		if(result == null) {
			//是 获取商品价格
			Long price = service.getById(pid).getPrice();
			//添加
			Cart cart = new Cart();
			cart.setUid(uid);
			cart.setPid(pid);
			cart.setNum(num);
			cart.setPrice(price);
			cart.setCreatedUser(username);
			cart.setCreatedTime(now);
			cart.setModifiedUser(username);
			cart.setModifiedTime(now);
			//插入
			insert(cart);
			
		}else {
			//否
			 // 从查询结果中获取原数量，和参数num相加，得到新数量
				Integer number = result.getNum()+ num;
			 //  执行更新数量
				updateNum(number,result.getCid(), username, new Date());
		}
		
	}
	
	/**
	 * 添加购物车信息
	 * @return
	 */
	private void insert(Cart cart) {
		Integer row = cartMap.insert(cart);
		if(row != 1) {
			throw new InsertException("购物车商品添加失败！");
		}
	};
	/**
	 * 修改购物车商品数量
	 * @param num 商品数量
	 * @param cid 购物车id
	 * @param modifiedUser 修改人
	 * @param modifiedTime 修改时间
	 * @return
	 */
	private void updateNum(Integer num ,Integer cid,String modifiedUser,Date modifiedTime) {
		Integer row = cartMap.updateNum(num, cid, modifiedUser, modifiedTime);
		if(row!= 1) {
			throw new UpdateException("修改购物车数据失败！");
		}
	};
	
	/**
	 * 通过用户id和商品id 查询购物车信息
	 * @return
	 */
	private Cart findByUidAndPid(Integer uid,Integer pid) {
		
		return cartMap.findByUidAndPid(uid, pid); 
	}

	/**
	 * 通过用户id 查询购物车关联数据 显示界面
	 */
	@Override
	public List<CartVo> getByUid(Integer uid) {
		
		return findByUid(uid);
	};
	
	private List<CartVo> findByUid(Integer uid){
		return cartMap.findByUid(uid);
	}

	@Override
	public Integer addNum(Integer cid, Integer uid, String username) {
		
		//通过cid查询商品信息
		Cart result = findByCid(cid);
		//判断  如果为null则 商品信息不存在 抛出CartNotFoundException异常
		if(result == null) {
			throw new CartNotFoundException("商品信息不存在！");
		}
		//查询result中的uid和参数uid是否一致
		if(!result.getUid().equals(uid)) {
			throw new AccessDeniedException("商品归属问题异常！");
		}
		//从查询结果中去除num，并加1
		Integer number = result.getNum() + 1;
		//返回新的数量
		updateNum(number, cid, username, new Date());
		//执行更新数量
		
		return number; 
	}
	
	private Cart findByCid(Integer cid) {
		
		return cartMap.findByCid(cid);
	}

	
	
	
	/**
	 * 根据若干个购物车数据id查询数据
	 * @param cids 若干个购物车数据id
	 * @return 匹配的购物车数据的列表
	 */
	private List<CartVo> findBycids(Integer[] cids){
		
		return cartMap.findByCids(cids);
		
	}
	
	/**
	 * 根据若干个购物车数据id查询数据
	 */
	@Override
	public List<CartVo> getByCarts(Integer[] cids,Integer uid) {
		//执行查询
		List<CartVo> result =  findBycids(cids);
		//遍历查询结果，移出非当前uid的数据
		Iterator<CartVo> list = result.iterator();
		//遍历  看看有没有下一个
		while(list.hasNext()) {
			CartVo item = list.next();
			if(!item.getUid().equals(uid)) {
				System.err.println("找到归属错误的数据，将移出！"+item);
				list.remove();
			}
		}
		
		return result;
	}

}
